// 导入自定义的 db 数据库操作模块
const db = require('../db/index.js')
const bcrypt = require('bcryptjs')
const { promisify } = require('util')

/**
 * ! 获取用户信息 
 */
exports.getUserInfo = (req, res) => {
  // 定义查询用户信息的 sql 语句，不查询密码信息
  const sql = `select id, username, nickname, email, user_pic from ev_users where id=?`
  // 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
  // 身份认证成功之后就会有 user 属性，其中包含了用户的信息
  db.query(sql, req.user.id, (err, results) => {
    if (err) return res.cc(err)
    if (results.length !== 1) return res.cc('获取用户信息失败！')
    //用户信息获取成功
    res.send({
      status: 0,
      message: '获取用户信息成功！',
      data: results[0]
    })
  })

}


/**
 * ! 更新用户信息
 * 必填参数：id，nickname，email
 */
exports.updateUserInfo = (req, res) => {
  const userinfo = req.body
  userinfo.id = parseInt(req.body.id) // 将接收过来的用户 id，转为 int 型
  if (!userinfo.nickname || !userinfo.email) return res.cc('请检查请求参数是否完整！')
  const sql = 'update ev_users set nickname=?, email=? where id=?'
  db.query(sql, [userinfo.nickname, userinfo.email, req.user.id], (err, results) => {
    if (err) return res.cc(err)
    // console.log(results);
    if (results.affectedRows !== 1) return res.cc('修改用户基本信息失败！')
    res.cc('修改用户基本信息成功！', 0)
  })
  // res.send('ok')
}


/**
 * ! 重置密码
 * 必填参数：old_pwd, new_pwd, re_pwd
 * 实现步骤：
 * 1. 根据 id 去查询用户的信息
 * 2. 先判断用户输入的旧密码是否与数据库的密码一致
 * 3. 再判断用户输入的新密码是否与确认密码一致
 * 4. 对新密码进行加密
 * 5. 修改密码
 */
exports.updatePassword = (req, res) => {
  const userinfo = req.body
  if (!userinfo.old_pwd || !userinfo.new_pwd || !userinfo.re_pwd) return res.cc('请检查请求参数是否完整！')
  // 1. 根据 id 去查询用户的信息
  const idSql = 'select * from ev_users where id=?'
  db.query(idSql, req.user.id, (err, results) => {
    if (err) return res.cc(err)
    if (results.length <= 0) return res.cc('该用户不存在，请先注册！')
    // 2. 先判断用户输入的旧密码是否与数据库的密码一致
    const compareResult = bcrypt.compareSync(userinfo.old_pwd, results[0].password)
    if (!compareResult) return res.cc('旧密码错误！')
    // 3. 再判断用户输入的新密码是否与确认密码一致
    if (userinfo.new_pwd !== userinfo.re_pwd) return res.cc('密码不一致，请重试！')
    // 4. 对新密码进行加密
    const newPwd = bcrypt.hashSync(userinfo.new_pwd, 6)
    // 5. 修改密码
    const pwdSql = 'update ev_users set password=? where id=?'
    db.query(pwdSql, [newPwd, req.user.id], (err, results) => {
      if (err) return res.send(err)
      if (results.affectedRows !== 1) return res.cc('修改密码失败！')
      res.cc('修改密码成功！', 0)
    })
  })

}


/**
 * ! 更换头像
 * 必传参数：avatar
 */
exports.updateAvatar = (req, res) => {
  if (!req.body.avatar) return res.cc('请检查请求参数！')
  // 更换头像
  const imgSql = 'update ev_users set user_pic=? where id=?'
  db.query(imgSql, [req.body.avatar, req.user.id], (err, results) => {
    if (err) return res.cc(err)
    if (results.affectedRows !== 1) return res.cc('更换头像失败！')
    res.cc('更换头像成功！', 0)
  })
}